#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <errno.h>
#include <string.h>
#include <iostream>
#include <sys/wait.h>


int main()
{
    int fds[2];
    int n = pipe(fds);
    if (n < 0){
        perror("pipe error");
        return 1;
    }
    pid_t fd = fork();
    if (fd == 0){
        //子进程 (写端)
        ::close(fds[0]); //关闭读端
        int total = 0;
        while(true)
        {
            // sleep(5);
            std::string message = "hello world";
            total += ::write(fds[1],message.c_str(),message.size());
            std::cout << "total: " << total << std::endl;
            sleep(1);
        }
        ::close(fds[1]);
        exit(0);
    }
    else {
        //父进程 (读端)
        ::close(fds[1]); //关闭写端
        char buffer[1024];
        while(true)
        {
            // std::cout << "wait data..." << std::endl;
            // sleep(100);
            ssize_t n= ::read(fds[0],buffer,5);
            if (n > 0){
                buffer[n] = 0;
                std::cout << "child -> father message: " << buffer << std::endl;
            }
            else if(n == 0){
                std::cout << "write quit??" << std::endl;
                break;
            }
            break;
        }
        ::close(fds[0]);
        int status = 0;
        pid_t rid = ::waitpid(fd,&status,0);
        if (rid > 0){
            std::cout << "wait child success: " << rid << " exit code: " << ((status>>8)&0xFF) << " exit signal: " << (status&0x7F) << std::endl;
        }
    }
    return 0;
}















































// #include <stdio.h>
// #include <stdlib.h>
// #include <string.h>
// #include <unistd.h>
// int main(void)
// {
//     int fds[2];
//     char buf[100];
//     int len;
//     if (pipe(fds) == -1)
//         perror("make pipe"), exit(1);
//     // read from stdin
//     while (fgets(buf, 100, stdin))
//     {
//         len = strlen(buf);
//         // 写端 - 在管道中固定了，1代表写,0代表读
//         if (write(fds[1], buf, len) != len)
//         {
//             perror("write to pipe");
//             break;
//         }
//         memset(buf, 0x00, sizeof(buf));
//         // 读端
//         if ((len = read(fds[0], buf, 100)) == -1)
//         {
//             perror("read from pipe");
//             break;
//         }

//         if (write(1, buf, len) != len)
//         {
//             perror("write to stdout");
//             break;
//         }
//     }
// }


// #define ERR_EXIT(m)         \
//     do                      \
//     {                       \
//         perror(m);          \
//         exit(EXIT_FAILURE); \
//     } while (0)
// int main(int argc, char *argv[])
// {
//     int pipefd[2];
//     if (pipe(pipefd) == -1)
//         ERR_EXIT("pipe error");
//     pid_t pid;
//     pid = fork();
//     if (pid == -1)
//         ERR_EXIT("fork error");
//     if (pid == 0)
//     {
//         //关闭读端
//         close(pipefd[0]);
//         write(pipefd[1], "hello", 5);
//         close(pipefd[1]);
//         exit(EXIT_SUCCESS);
//     }
//     //关闭写端
//     close(pipefd[1]);
//     char buf[10] = {0};
//     read(pipefd[0], buf, 10);
//     printf("buf=%s\n", buf);
//     return 0;
// }

// int main()
// {
//     int* a=  new int(10);
//     if (fork() == 0){
//         free(a);
//         a = nullptr;
//         std::cout << "我是子进程，我把父进程创建的a释放掉了" << std::endl;
//     }

//     return 0;
// }